// connection.hpp(套接字封装)
#pragma once
#include <functional>

namespace limou {
    // 类声明
    class EpollServer;

    /* 为了能够正常工作, 避免描述符未读取完就丢失, 因此常规的服务 sock 必须是有自己的发送/接受缓冲区的, 本类专门用来封装描述符 */
    class Connection {
    private:
        using func_t = std::function<void(Connection*)>;

        
    public:
        // 封装套接字, 并且保存使用该对象的服务器对象指针信息
        Connection(const int& sock = -1, EpollServer* tsvr = nullptr) : _sock(sock), _tsvr(tsvr) {}

        // 设置套接字的读写异常回调方法
        void SetCallBack(func_t recv_cb, func_t send_cb, func_t except_cb) {
            _recv_cb = recv_cb; // 设置读回调
            _send_cb = send_cb; // 设置写回调
            _except_cb = except_cb; // 设置异常回调
        }

        
    public:
        // 负责 IO 服务的文件描述符
        int _sock;

        // 设置对 EpollServer 的回指指针
        EpollServer* _tsvr;

        // 发送/接受缓冲区, 为了保证每个套接字都完整读取, 应对每一个套接字设置单独的缓冲区(暂时无法处理二进制流)
        std::string _inbuffer;
        std::string _outbuffer;

        // 以下三个回调方法就是对 _sock 进行特定读写对应的方法
        func_t _recv_cb; // 读回调
        func_t _send_cb; // 写回调
        func_t _except_cb; // 异常回调

        // 拓展定制链接管理功能(获取时间戳)
        uint64_t _lastTimeStamp;
    };
}